package poc.scc.core;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import poc.scc.core.enums.StatusContrato;
import poc.scc.core.enums.TipoProcessoContratacao;
@Entity
@SequenceGenerator(name="seq", sequenceName="seq_contrato")
public class Contrato implements Serializable{

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
	private Long id;

	private String objeto;
	
	@Column(name="numero_contrato")
	private String numeroContrato;
	
	@Column(name="numero_processo")
	private String numeroProcesso;
	
	private String telefone;
	private String fax;
	private String email;
	
	@Temporal(TemporalType.DATE)
	@Column(name="data_inicio")
	private Date dataInicio;
	
	@Temporal(TemporalType.DATE)
	@Column(name="data_fim")
	private Date dataFim;
	
	@Column(name="valor_total_estimado")
	private BigDecimal valorTotalEstimado;
	
	@Column(name="valor_reajustes")
	private BigDecimal valorReajustes;
	
	@Column(name="valor_liberado_ate_presente_data")
	private BigDecimal valorLiberadoAtePresenteData;
	
	@Column(name="status")
	@Enumerated(EnumType.STRING)
	private StatusContrato status;
	
	@Column(name="tipo_processo_contratacao")
	@Enumerated(EnumType.STRING)
	private TipoProcessoContratacao tipoProcessoContratacao;
	
	private Boolean emergencial;
	
	@Temporal(TemporalType.DATE)
	@Column(name="data_recisao")
	private Date dataRescisao;
	
	@Temporal(TemporalType.DATE)
	@Column(name="data_publicacao_diario")
	private Date dataPublicacaoDiario;
	
	@Embedded
	private ContaBancaria contaBancaria;
	
	@Temporal(TemporalType.DATE)
	@Column(name="data_inicio_servicos")
	private Date dataInicioServicos;
	
    private Boolean houveParalizacoes = false;
    
    @Column(name="descricao_paralizacoes")
    private String descricaoParalizacoes;
    
    @ManyToOne
    @JoinColumn(name="tipo_contrato_id")
    private TipoContrato tipoContrato;
    
    @OneToMany
    @JoinColumn(name="contrato_id")
    private List<Pagamento> pagamentos = new ArrayList<Pagamento>();
    
    @OneToMany
    @JoinColumn(name="contrato_id")
    private List<AditivoContrato> aditivos = new ArrayList<AditivoContrato>();

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getObjeto() {
		return objeto;
	}

	public void setObjeto(String objeto) {
		this.objeto = objeto;
	}

	public String getNumeroContrato() {
		return numeroContrato;
	}

	public void setNumeroContrato(String numeroContrato) {
		this.numeroContrato = numeroContrato;
	}

	public String getNumeroProcesso() {
		return numeroProcesso;
	}

	public void setNumeroProcesso(String numeroProcesso) {
		this.numeroProcesso = numeroProcesso;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getFax() {
		return fax;
	}

	public void setFax(String fax) {
		this.fax = fax;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}

	public Date getDataFim() {
		return dataFim;
	}

	public void setDataFim(Date dataFim) {
		this.dataFim = dataFim;
	}

	public BigDecimal getValorTotalEstimado() {
		return valorTotalEstimado;
	}

	public void setValorTotalEstimado(BigDecimal valorTotalEstimado) {
		this.valorTotalEstimado = valorTotalEstimado;
	}

	public BigDecimal getValorReajustes() {
		return valorReajustes;
	}

	public void setValorReajustes(BigDecimal valorReajustes) {
		this.valorReajustes = valorReajustes;
	}

	public BigDecimal getValorLiberadoAtePresenteData() {
		return valorLiberadoAtePresenteData;
	}

	public void setValorLiberadoAtePresenteData(
			BigDecimal valorLiberadoAtePresenteData) {
		this.valorLiberadoAtePresenteData = valorLiberadoAtePresenteData;
	}

	public StatusContrato getStatus() {
		return status;
	}

	public void setStatus(StatusContrato status) {
		this.status = status;
	}

	public TipoProcessoContratacao getTipoProcessoContratacao() {
		return tipoProcessoContratacao;
	}

	public void setTipoProcessoContratacao(
			TipoProcessoContratacao tipoProcessoContratacao) {
		this.tipoProcessoContratacao = tipoProcessoContratacao;
	}

	public Boolean getEmergencial() {
		return emergencial;
	}

	public void setEmergencial(Boolean emergencial) {
		this.emergencial = emergencial;
	}

	public Date getDataRescisao() {
		return dataRescisao;
	}

	public void setDataRescisao(Date dataRescisao) {
		this.dataRescisao = dataRescisao;
	}

	public Date getDataPublicacaoDiario() {
		return dataPublicacaoDiario;
	}

	public void setDataPublicacaoDiario(Date dataPublicacaoDiario) {
		this.dataPublicacaoDiario = dataPublicacaoDiario;
	}

	public ContaBancaria getContaBancaria() {
		return contaBancaria;
	}

	public void setContaBancaria(ContaBancaria contaBancaria) {
		this.contaBancaria = contaBancaria;
	}

	public Date getDataInicioServicos() {
		return dataInicioServicos;
	}

	public void setDataInicioServicos(Date dataInicioServicos) {
		this.dataInicioServicos = dataInicioServicos;
	}

	public Boolean getHouveParalizacoes() {
		return houveParalizacoes;
	}

	public void setHouveParalizacoes(Boolean houveParalizacoes) {
		this.houveParalizacoes = houveParalizacoes;
	}

	public String getDescricaoParalizacoes() {
		return descricaoParalizacoes;
	}

	public void setDescricaoParalizacoes(String descricaoParalizacoes) {
		this.descricaoParalizacoes = descricaoParalizacoes;
	}

	public TipoContrato getTipoContrato() {
		return tipoContrato;
	}

	public void setTipoContrato(TipoContrato tipoContrato) {
		this.tipoContrato = tipoContrato;
	}
}
